home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 15 / BBS in a box XV-1.iso / Files / Internet / Misc / Uupc 3.1 sources.sit / uupc 3.1 sources Folder / Mac specific / Unix lib / rename.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-03-01  |  2.6 KB  |  136 lines  |  [TEXT/KAHL]

  1. /* Copyright (C) 1984 by Manx Software Systems, Inc. */
  2.  
  3. #ifndef    THINK_C
  4. #include    <quickdraw.h>
  5. #include    <pb.h>
  6.  
  7. #define        _DEBUG
  8. #include    <max/debug.h>
  9. #endif    THINK_C
  10. #include    <errno.h>
  11. #include <stdio.h>
  12.  
  13. #include "rename.proto.h"
  14.  
  15. long setdir(char *path, char *dir, char *name)
  16. {
  17.     CInfoPBRec cpb;
  18.     int err;
  19.  
  20.     if (*path == '/') (void)
  21.     splitname( path, dir, name );
  22.     
  23. #ifdef TEST
  24.     fprintf( stderr, "setdir: \"%s\" \"%s\" \"%s\"\n", name, dir, path );
  25. #endif
  26.     CtoPstr( dir );
  27.     cpb.dirInfo.ioNamePtr = (StringPtr)dir;
  28.     
  29.     cpb.dirInfo.ioVRefNum = 0;
  30.     cpb.dirInfo.ioFDirIndex = 0;
  31.     cpb.dirInfo.ioDrDirID = 0L;
  32.  
  33.     if ((err = PBGetCatInfo( &cpb, 0 )) != 0 ) {
  34.  
  35. #ifdef TEST
  36.     fprintf( stderr, "setdir: err %d\n", err );
  37. #endif
  38.         
  39.     }
  40.  
  41.     return( cpb.dirInfo.ioDrDirID );
  42.  
  43. }
  44.  
  45. rename(char *old, char *new)
  46. {
  47.     register int i, err;
  48.     long int freeb;
  49.     int vrefnum;
  50.     
  51.     HParamBlockRec    pb;
  52.     CMovePBRec         cm;
  53.         
  54.     char nbuf[255], ndir[64], nname[32];
  55.     char obuf[255], odir[64], oname[32];
  56.  
  57.  
  58.     importpath(obuf, old);
  59.     importpath(nbuf, new);
  60.     
  61. #ifdef TEST
  62.     fprintf( stderr, "rename: obuf|%s -> nbuf|%s\n", obuf, nbuf );
  63. #endif
  64.  
  65.     /* get dir refnums, fix path names, get dir name, and name */
  66.     cm.ioNewDirID = setdir( nbuf, ndir, nname );
  67.     cm.ioDirID = setdir( obuf, odir, oname );    
  68.     
  69.     /* use name only */
  70.     if ( cm.ioDirID != cm.ioNewDirID ) {
  71. #ifdef TEST
  72.         fprintf( stderr, "rename: catmove\n" );
  73.         fprintf( stderr, "rename: %ld|%s -> %ld|%s\n", 
  74.                 pbcm.cm.ioDirID, obuf, pbcm.cm.ioNewDirID, ndir );
  75. #endif
  76.         /* use full path name including volume name */
  77.         CtoPstr(obuf);
  78.         cm.ioNamePtr = (StringPtr)obuf;
  79.         cm.ioNewName = (StringPtr)ndir;
  80.         cm.ioVRefNum = 0;        /* use default directory */
  81.         err = PBCatMove(&cm, FALSE);
  82.     }
  83.     else
  84.         err = 0;
  85.     if (err) {
  86.         if (err == -48)
  87.             err = EEXIST;
  88.         errno = err;
  89.         return(-1);
  90.     }
  91.     else {
  92. #ifdef TEST
  93.     fprintf( stderr, "rename: rename\n" );
  94.     fprintf( stderr, "rename: %ld|%s -> %ld|%s\n", 
  95.             pbcm.cm.ioDirID, oname, pbcm.cm.ioNewDirID, nname);
  96. #endif
  97.         CtoPstr(oname);
  98.         pb.ioParam.ioNamePtr = (StringPtr)oname;
  99.         pb.ioParam.ioVersNum = 0;
  100.         CtoPstr(nname);
  101.         pb.ioParam.ioMisc = nname;
  102.         pb.fileParam.ioDirID =  cm.ioNewDirID;
  103.         err = PBHRename(&pb, FALSE);
  104.         if (err) {
  105.             if (err == -48)
  106.                 err = EEXIST;
  107.             errno = err;
  108.             return(-1);
  109.         }
  110.         else
  111.             return(0);
  112.     }
  113. }
  114.  
  115. #ifdef TEST
  116. #include <errno.h>
  117.  
  118. main(void)
  119. {
  120.     char command[100];
  121.  
  122.     char f1[100], f2[100];
  123.  
  124.     while(gets(command) != NULL) {
  125.         sscanf( command, "%s%s", f1, f2 );
  126.  
  127.         fprintf( stderr, "test: %s %s\n", f1, f2 );
  128.  
  129.         if ( rename( f1, f2 ) == 0 )
  130.             fprintf( stderr, "test: OK\n\n" );
  131.         else
  132.             fprintf( stderr, "test: ERROR %d\n\n", errno );
  133.     }
  134. }
  135. #endif
  136.